import axios from 'axios'
import { message } from 'ant-design-vue'
import { useAuthUserStore } from '@/store/authUserStore'
import { handleFileDownload, isFileDownloadResponse, transformKeysToSnakeCase } from '@/utils/axiosUtil'

// 创建 axios 实例
const instance = axios.create({
  baseURL: import.meta.env.VITE_APP_BASE_API,
  timeout: 8000, // 默认请求超时时间，单位是毫秒
})

let skippingLogin = false

// 请求拦截器
instance.interceptors.request.use(
  function (config) {
    // Do something before request is sent
    // 从本地存储中获取token
    const authUserStore = useAuthUserStore()
    const token = authUserStore.token
    // console.log(token)
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    // 修改数据转换逻辑：跳过FormData类型的数据
    if (config.data && !(config.data instanceof FormData)) {
      config.data = transformKeysToSnakeCase(config.data)
    }
    if (config.params && !(config.params instanceof FormData)) {
      config.params = transformKeysToSnakeCase(config.params)
    }

    return config
  },
  function (error) {
    return Promise.reject(error)
  }
)

// 响应拦截器
instance.interceptors.response.use(
  (response) => {
    if (isFileDownloadResponse(response)) {
      handleFileDownload(response)
      return
    }
    if (!response.data) {
      console.log('API response missing data')
      message.error('伺服器無返回數據 (No Data)') // 增加英文簡稱
      return Promise.reject(response)
    }
    // 統一處理成功響應
    if (response.data.code == 'SUCCESS') {
      return response.data
    }
    message.error(response.data.message || 'Request Failed')
    return Promise.reject(response.data)
  },
  (error) => {
    // 統一處理網絡錯誤
    if (error.response) {
      const { status, data } = error.response
      const errorMessage = data?.message || 'Operation Failed' // 改為中性表述

      switch (status) {
        case 400:
          message.error(`請求參數無效 (400 Bad Request)：${errorMessage}`)
          break
        case 401:
          if (!window.location.pathname.includes('/login') && !skippingLogin) {
            message.warning('登錄憑證已過期，系統即將自動跳轉至登錄頁...')
            skippingLogin = true
            // 清除 token 和用户信息
            const authUserStore = useAuthUserStore()
            authUserStore.clearData()
            // 延迟 3 秒后跳转，确保提示信息显示完整
            setTimeout(() => {
              window.location.href = `/login?redirect=${window.location.href}`
              skippingLogin = false
            }, 3000)
          }
          break
        case 403:
          message.error(`權限不足 (403 Forbidden)`) //
          break
        case 404:
          message.error(`資源不存在 (404 Not Found)`) // 增加狀態碼英文
          break
        case 422:
          message.error(`無效請求參數 (Unprocessable Entity)：${errorMessage}`)
          break
        case 500:
          message.error(`伺服器異常 (500 Internal Error)`) // 標準化表述
          break
        default:
          message.error(`服務暫時不可用 (HTTP ${status})`) // 通用商業化表述
      }
      return Promise.reject(data || { code: 'HTTP_ERROR', message: errorMessage })
    }

    if (error.request) {
      console.log('Request:', error.request)
      message.error('請求超時 - 請檢查網絡後重試')
      return Promise.reject({ code: 'TIMEOUT_ERROR', message: '請求超時' })
      // message.error('連線異常 - 請檢查網絡後重試')
      // return Promise.reject({ code: 'NETWORK_ERROR', message: '網絡連線異常' })
    }
    message.error('無效請求格式 (Bad Request)') // 使用標準術語
    return Promise.reject({ code: 'REQUEST_ERROR', message: '請求參數無效' })
  }
)

export default instance
